Программа должна быть маленькой и гибкой, ее подпрограммы должны соединяться как жемчужины в ожерелье. (Дао Программирования)
Итак, мы только что научились программировать вычисление по формуле. Любой.
Что мы будем делать, если та же формула потребуется нам еще раз? А еще?
Простой подход - копирование/вставка. Современные редакторы позволяют делать это легко.
Но этот подход - неправильный. Недостатки подхода - "разбухание" программы (один кусок повторяется много раз) и сложность внесения изменений / исправлений (нужно внести одинаковые изменения во все кусочки, которые еще надо найти. И не дай бог пропустить кусочек.)
Правильный подход - повторное использование кода. То, что будет использовано несколько раз, записывается единожды, но оформляется в виде подпрограммы. На С имеется единственный тип подпрограммы - функция. Там, где кусочек нужен, вставляется инструкция вызова функции.
Мы уже использовали функции из стандартной библиотеки. При вычислении по формуле это были знакомые из математики функции, например, синус: sin(x). Операция печати тоже выполняется функцией: printf.
Теперь научимся делать свои собственные.
Давайте создадим функцию, вычисляющую
У функции есть входные значения (параметры) - в нашем случае их два: a и b, есть возвращаемое значение (результат вычисления).
Значения имеют тип, для вычислений это в основном double.
(100%)Врезка - Void значит "пустота"
Вообще говоря, функция может не иметь параметров (например, если функция выдает случайное число; или текущее время), тогда в скобках пишется void.
Может не возвращать значения (и вместо вычислений заниматься, скажем, печатью), тогда void пишется перед названием функции.
Таким образом, первая строка - заголовок функции - будет иметь вид
double f(double a,double b)
Далее в фигурных скобках идет тело функции - "полезная нагрузка". В данном случае это вычисление выражения. Переданные параметры доступны в теле функции как переменные. Можно дополнительно объявить переменные; эти переменные будут локальными (существовать только внутри функции, никак не влияя на переменные с тем же именем снаружи / в других функциях). Мы создадим переменную y.
Полученный результат нужно вернуть как значение функции (строка "return y;").
Можно делать короче, совместив вычисление с возвратом значения. Этот пример можно сократить до одной строки:
returnsin(3*a)+cos(5*b);
Теперь давайте используем нашу функцию для вычисления формулы
sin3x+cos 5y
---------------- - sin3градуса -1
cos 5(x+y)
Формула немножко хитрая (исключительно в учебных целях); если вспомнить, что sin(0)=0, а cos(0)=1, видно, что ее можно переписать с использованием нашей функции как
f(x, y)
----------- - f(3градус, 0)
f(0, x+y)
Это демонстрирует нам такое важное достоинство функций, как параметризация – что бы мы ни подставили при вызове как фактические параметры, оно при необходимости будет вычислено и передано в функцию. А там уже будет подставлено вместо формальных параметров (у нас a и b).
Для того, чтобы в основной программе (main) можно было использовать функцию, она должна быть записана выше main (можно и ниже, но тогда перед main придется вставлять заголовок функции - ее первую строку, вот так:
Как мы уже выяснили раньше, строка #define _USE_MATH_DEFINES нужна для того, чтобы в math.h стала определена константа M_PI, число Пи, нужное нам для преобразование из градусов в радианы в вызове функции.
Подробнее о функциях можно почитать, например, в пособии "Информатика. Сегментация программ" Р.Н. Гурьяшова, А.В. Шеянов.
Программа должна быть маленькой и гибкой, ее подпрограммы должны соединяться как жемчужины в ожерелье.
(Дао Программирования)
Итак, мы только что научились программировать вычисление по формуле. Любой.
Что мы будем делать, если та же формула потребуется нам еще раз? А еще?
Простой подход - копирование/вставка. Современные редакторы позволяют делать это легко.
Но этот подход - неправильный. Недостатки подхода - "разбухание" программы (один кусок повторяется много раз) и сложность внесения изменений / исправлений (нужно внести одинаковые изменения во все кусочки, которые еще надо найти. И не дай бог пропустить кусочек.)
Правильный подход - повторное использование кода. То, что будет использовано несколько раз, записывается единожды, но оформляется в виде подпрограммы. На С имеется единственный тип подпрограммы - функция. Там, где кусочек нужен, вставляется инструкция вызова функции.
Мы уже использовали функции из стандартной библиотеки. При вычислении по формуле это были знакомые из математики функции, например, синус: sin(x). Операция печати тоже выполняется функцией: printf.
Теперь научимся делать свои собственные.
Давайте создадим функцию, вычисляющую
Назовем нашу функцию f.
У функции есть входные значения (параметры) - в нашем случае их два: a и b, есть возвращаемое значение (результат вычисления).
Значения имеют тип, для вычислений это в основном double.
Вообще говоря, функция может не иметь параметров (например, если функция выдает случайное число; или текущее время), тогда в скобках пишется void.
Может не возвращать значения (и вместо вычислений заниматься, скажем, печатью), тогда void пишется перед названием функции.
Таким образом, первая строка - заголовок функции - будет иметь вид
Далее в фигурных скобках идет тело функции - "полезная нагрузка". В данном случае это вычисление выражения. Переданные параметры доступны в теле функции как переменные. Можно дополнительно объявить переменные; эти переменные будут локальными (существовать только внутри функции, никак не влияя на переменные с тем же именем снаружи / в других функциях). Мы создадим переменную y.
Полученный результат нужно вернуть как значение функции (строка "return y;").
Можно делать короче, совместив вычисление с возвратом значения. Этот пример можно сократить до одной строки:
Теперь давайте используем нашу функцию для вычисления формулы
Формула немножко хитрая (исключительно в учебных целях); если вспомнить, что sin(0)=0, а cos(0)=1, видно, что ее можно переписать с использованием нашей функции как
Это демонстрирует нам такое важное достоинство функций, как параметризация – что бы мы ни подставили при вызове как фактические параметры, оно при необходимости будет вычислено и передано в функцию. А там уже будет подставлено вместо формальных параметров (у нас a и b).
Для того, чтобы в основной программе (main) можно было использовать функцию, она должна быть записана выше main (можно и ниже, но тогда перед main придется вставлять заголовок функции - ее первую строку, вот так:
)
Полный код программы:
Как мы уже выяснили раньше, строка #define _USE_MATH_DEFINES нужна для того, чтобы в math.h стала определена константа M_PI, число Пи, нужное нам для преобразование из градусов в радианы в вызове функции.
Подробнее о функциях можно почитать, например, в пособии "Информатика. Сегментация программ" Р.Н. Гурьяшова, А.В. Шеянов.